package service;

import java.util.List;

import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TypedQuery;

import entity.Projeto;
import entity.Recurso;
import entity.Risco;

@Stateless
@LocalBean
public class RiscosService {
	@PersistenceContext(unitName = "almirante")
	private EntityManager em;

	@EJB
	private ProjetoService projetoService;
	
	/**
	 * Inclui um novo projeto.
	 * @param nome
	 * @param inicio
	 * @param fim
	 * @return Projeto
	 */
	public void incluirRisco(Long idProjeto, Risco risco) {
		
		Projeto projeto = projetoService.obterProjeto(idProjeto);
		
		risco.setProjeto(projeto);
		
		em.persist(risco);
	}
	
	public void alterarRisco(Risco risco){
		em.merge(risco);
	}
	
	public List<Recurso> listarRecursosNaoVinculadosAIteracao(Long idIteracao) {
		String jpql = "SELECT r " +
				"FROM Recurso r, Iteracao i " +
				"WHERE r NOT MEMBER OF i.recursos " +
				"AND i.id = :idIteracao";
		
		TypedQuery<Recurso> query = em.createQuery(jpql, Recurso.class);
		query.setParameter("idIteracao", idIteracao);
		
		return query.getResultList();
	}

	public List<Risco> pesquisarRiscoDoProjeto(Long idProjeto, Risco risco){
			
		StringBuffer hql = new StringBuffer("FROM Risco r WHERE ");
		//TODO tirar a gambiarra..
		if (risco.getNomeRisco() != null && !"".equals(risco.getNomeRisco())){
			hql.append("r.nomeRisco like :nomeRisco AND ");
		}
		 if(risco.getGravidade() != null && !"".equals(risco.getGravidade())){
			hql.append("r.gravidade = :gravidade AND ");
		}
			hql.append(" r.manifestado = :manifestado AND r.projeto.id = :idProjeto");
		
		Query query = em.createQuery(hql.toString());
		if (risco.getNomeRisco() != null && !"".equals(risco.getNomeRisco())){
			query.setParameter("nomeRisco", "%"+risco.getNomeRisco()+"%");
		}
		
		if(risco.getGravidade() != null && !"".equals(risco.getGravidade())){
		
			query.setParameter ("gravidade",risco.getGravidade());
		}
		
		query.setParameter("manifestado", risco.isManifestado());
		query.setParameter("idProjeto", idProjeto);
		
		return query.getResultList();
		
	}
	
	public void excluirRisco(Risco risco){
		risco = em.find(Risco.class, risco.getId());
		
		em.remove(risco);
	}
}
